如何使用Arduino对DS12C887时钟模块进行时间读写
搜了一下DS12C887的资料,最详细的是郭天祥关于这个模块的视频教程,教程中讲解了这个模块的使用手册和程序的编写,但是这个教程是在51单片机上讲的,由于51与Arduino的不同,把程序直接移植到Arduino上比较困难。
由于在网上没有搜到与这个时钟模块相关的Arduino库或基于arduino的教程,本人参考了一些资料,写出了Arduino下的程序,并成功进行了时间的读写,于是就把方法记录下来保存了。
本文将提供相应的接线方法以及程序。
先简单介绍一下DS12C887这个时钟模块:
可计算到2100年前的秒、分、小时、星期、日期、月、年七种日历信息并带闰年补偿; 自带晶体振荡器和锂电池。在没有外部电源的情况下可工作10年; ——百度百科
![模块实物](https://img-blog.csdn.net/20180226111016380?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWGlucGVuZ21ha2Vy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
缺点: 地址/数据总线有8根,占用了很多IO口 相比1302,3231时钟模块体积更大,不适合装在小体积产品上
零件表
零件数量arduino UNO1arduino 拓展版1DS12C887模块1面包板1电池1杜邦线若干
Arduino UNO+DS12C887接线
NC=not connect,就是不连接的意思。 MOT悬空即Inter总线模式,这里我们选用Inter总线模式,所以MOT引脚悬空。 DS12C887对应Arduino UNO引脚:
DS12C887UNO4455667788991010111112GND1314(A0)1415(A1)1516(A2)1717(A3)18VCC191224VCC
程序源码
1const int dscs=14; 2const int dsas=15; 3const int dsrw=16; 4const int dsds=17; 5const int dsirq=12; 6//define bidirectional address-data bus(定义双向地址总线) 7const int ad[8]={4,5,6,7,8,9,10,11}; 8//寄存器A B C D的地址 9#define regA 0x0A 10#define regB 0x0B 11#define regC 0x0C 12#define regD 0x0D 13//函数声明 14void bus2out(); 15void bus2in(); 16void write_ds(byte add,byte date); 17byte read_ds(byte add); 18void set_time(); 19void set_alarm(byte ashi,byte afen,byte amiao); 20byte miao,fen,shi,ri,yue,nian,xq; 21int i; 22void setup() 23{ 24 Serial.begin(9600); 25 pinMode(dscs, OUTPUT); 26 pinMode(dsas, OUTPUT); 27 pinMode(dsrw, OUTPUT); 28 pinMode(dsds, OUTPUT); 29 pinMode(dsirq, OUTPUT); 30//芯片初始化 31// write_ds(regA,0x20); // 控制A寄存器来开启晶体振荡器且保持时钟运行。 32// write_ds(regB,0x26); //设置24小时模式,数据二进制模式,开启闹铃中断。 33//时间初始化 34// set_time();//设置初始时间,运行一次即可注释掉 35// set_alarm(13,30,0);//设置闹钟 36} 37void loop() 38{ 39 //读取时间 40 miao=read_ds(0); 41 fen=read_ds(2); 42 shi=read_ds(4); 43 ri=read_ds(7); 44 yue=read_ds(8); 45 nian=read_ds(9); 46 xq=read_ds(6); 47// miao=(miao&0x0f)+((miao&0xf0)>>4)*10;//若使用BCD码需要进行位运算处理 48 Serial.print(nian); 49 Serial.print("/"); 50 Serial.print(yue); 51 Serial.print("/"); 52 Serial.print(ri); 53 Serial.print(" "); 54 Serial.print(shi); 55 Serial.print(":"); 56 Serial.print(fen); 57 Serial.print(":"); 58 Serial.print(miao); 59 Serial.print(" 星期:"); 60 Serial.println(xq); 61} 62void bus2out(){ 63 for(i=0;i 69 for(i=0;i 76 bus2out(); //set address pins to output 77 digitalWrite(dscs,0); 78 digitalWrite(dsas,1); 79 digitalWrite(dsds,1); 80 digitalWrite(dsrw,1); 81 //set address on bus(写地址) 82 for(i=0;i116 write_ds(0,10);//秒117 write_ds(2,19);//分118 write_ds(4,13);//时119 write_ds(7,26);//日120 write_ds(8,2);//月121 write_ds(9,18);//年122 write_ds(6,1);//星期123}124void set_alarm(byte ashi,byte afen,byte amiao) //闹钟设初值125{126 write_ds(1,amiao);127 write_ds(3,afen);128 write_ds(5,ashi);129}
arduino程序源码以及DS12C887模块的中文手册: https://pan.baidu.com/s/1c369ui0
|